#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#import "PushPackage.h"
#import "GJIMMessageModel.h"
#import "GJIMSessionService.h"
#import "BDEncrypt.h"
#import "BDChatBasicCell.h"
#import "GJIMDBService.h"
#import "GJIMSessionToken.h"

%hook GJIMSessionService

- (id)p_handlePushPackage:(PushPackage *)pkg {
    switch (pkg.messageType) {
        case 55: { // 消息撤回拦截
            NSLog(@"[BLUEDHOOK] %@ 撤回消息已被拦截", pkg.name);
            
            GJIMSessionToken *sessionToken = [objc_getClass("GJIMSessionToken") gji_sessionTokenWithId:pkg.sessionId type:2];
            [objc_getClass("GJIMDBService") gji_getMessagesWithToken:sessionToken complete:^(id data) {
                GJIMMessageModel *targetMsg;
                for (GJIMMessageModel *msg in data) {
                    if (msg.msgId == pkg.messageId) {
                        targetMsg = msg;
                        break;
                    }
                }
                
                if (!targetMsg) {
                    NSLog(@"[BLUEDHOOK] 警告: 未找到原始消息 %llu", pkg.messageId);
                    for (GJIMMessageModel *msg in data) {
                        if (msg.fromId == pkg.from) {
                            targetMsg = msg;
                            break;
                        }
                    }
                    targetMsg.type = 1;
                    targetMsg.msgId = pkg.messageId;
                    targetMsg.sendTime = pkg.timestamp;
                    targetMsg.msgExtra = @{@"BLUED_HOOK_IS_RECALLED": @1};
                    targetMsg.content = @"对方撤回了一条消息，但已错过接收原始消息无法复原";
                    [self addMessage:targetMsg];
                    return;
                }
                
                targetMsg.msgExtra = @{@"BLUED_HOOK_IS_RECALLED": @1};
                [self updateMessage:targetMsg];
            }];
            return nil;
        }
        case 24: { // 闪照处理
            pkg.messageType = 2;
            pkg.contents = [objc_getClass("BDEncrypt") decryptVideoUrl:pkg.contents];
            pkg.msgExtra = @{@"BLUEDHOOK_IS_SNAPIMG": @1};
            break;
        }
        case 25: { // 销毁视频处理
            pkg.messageType = 5;
            pkg.contents = [objc_getClass("BDEncrypt") decryptVideoUrl:pkg.contents];
            pkg.msgExtra = @{@"BLUEDHOOK_IS_DESTROYED_VIDEO": @1};
            break;
        }
        default: break;
    }
    return %orig(pkg);
}

%end

%hook UITableViewCell

- (UIView *)contentView {
    UIView *contentView = %orig;
    
    // 仅处理目标聊天单元格
    if (![NSStringFromClass([self class]) containsString:@"PrivateOther"]) {
        return contentView;
    }
    
    GJIMMessageModel *msg = [[(BDChatBasicCell*)self message] copy];
    if (!msg) return contentView;
    
    NSLog(@"处理消息: 类型=%llu, ID=%llu, 内容=%@\n闪照标记=%@, 撤回标记=%@", 
          msg.type, msg.msgId, msg.content,
          msg.msgExtra[@"BLUEDHOOK_IS_SNAPIMG"],
          msg.msgExtra[@"BLUED_HOOK_IS_RECALLED"]);
    
    // 实时转换闪照/销毁视频
    if (msg.type == 24) {
        msg.type = 2;
        msg.content = [objc_getClass("BDEncrypt") decryptVideoUrl:msg.content];
        msg.msgExtra = @{@"BLUEDHOOK_IS_SNAPIMG": @1};
        [[objc_getClass("GJIMSessionService") sharedInstance] updateMessage:msg];
    } 
    else if (msg.type == 25) {
        msg.type = 5;
        msg.content = [objc_getClass("BDEncrypt") decryptVideoUrl:msg.content];
        msg.msgExtra = @{@"BLUEDHOOK_IS_DESTROYED_VIDEO": @1};
        [[objc_getClass("GJIMSessionService") sharedInstance] updateMessage:msg];
    }
    
    // 添加提示标签
    NSInteger labelTag = 1069;
    UILabel *label = [self viewWithTag:labelTag] ?: [[UILabel alloc] init];
    
    // 动态计算标签位置
    CGFloat labelTop = contentView.frame.size.height - 12;
    CGFloat labelLeft = [contentView.subviews[2] frame].origin.x;
    
    switch (msg.type) {
        case 1: labelTop -= 8; labelLeft += 12; break;
        case 2: labelTop = contentView.frame.size.height - 215; break;
        case 3: labelLeft += 12; break;
        case 5: labelTop = contentView.frame.size.height - 230; break;
        default: break;
    }
    
    label.frame = CGRectMake(labelLeft, labelTop, contentView.frame.size.width, 12);
    label.font = [UIFont systemFontOfSize:9];
    label.textColor = [UIColor redColor];
    label.tag = labelTag;
    
    // 设置提示文本
    if (msg.msgExtra[@"BLUEDHOOK_IS_SNAPIMG"]) {
        label.text = @"该照片由闪照转换而成";
    } 
    else if (msg.msgExtra[@"BLUED_HOOK_IS_RECALLED"]) {
        label.text = [msg.content containsString:@"burn-chatfiles"] ? 
                    @"该闪照已被对方撤回" : 
                    @"对方尝试撤回此消息，已被阻止";
    }
    else if (msg.msgExtra[@"BLUEDHOOK_IS_DESTROYED_VIDEO"]) {
        label.text = @"该视频由销毁视频转换而成";
    }
    
    if (label.text.length > 0) {
        [self addSubview:label];
    }
    
    return contentView;
}

%end

%ctor {
    @autoreleasepool {
        %init(GJIMSessionService = objc_getClass("GJIMSessionService"),
              UITableViewCell = objc_getClass("UITableViewCell"));
    }
}


%hook BDSessionCallListView

// Hook getter 方法 `isHidden`，使其始终返回 YES (1)
- (BOOL)isHidden {
return YES; // 强制返回隐藏状态
}

// 也可以 Hook setter 方法，防止外部修改
- (void)setHidden:(BOOL)hidden {
%orig(YES); // 无论传入什么值，都强制设为 YES
}

%end

%hook BDSNearbyRecommendCell

// Hook getter 方法 `isHidden`，使其始终返回 YES (1)
- (BOOL)isHidden {
return YES; // 强制返回隐藏状态
}

// 也可以 Hook setter 方法，防止外部修改
- (void)setHidden:(BOOL)hidden {
%orig(YES); // 无论传入什么值，都强制设为 YES
}

%end

%hook BDAudioServiceCollectionViewCell ////我的页面 聊天室频道

// Hook getter 方法 `isHidden`，使其始终返回 YES (1)
- (BOOL)isHidden {
return YES; // 强制返回隐藏状态
}

// 也可以 Hook setter 方法，防止外部修改
- (void)setHidden:(BOOL)hidden {
%orig(YES); // 无论传入什么值，都强制设为 YES
}

%end

%hook BDLiveServiceCollectionCell //我的页面 频道

// Hook getter 方法 `isHidden`，使其始终返回 YES (1)
- (BOOL)isHidden {
return YES; // 强制返回隐藏状态
}

// 也可以 Hook setter 方法，防止外部修改
- (void)setHidden:(BOOL)hidden {
%orig(YES); // 无论传入什么值，都强制设为 YES
}

%end

%hook BDOtherServiceCollectionCell //我的页面 其他服务

// Hook getter 方法 `isHidden`，使其始终返回 YES (1)
- (BOOL)isHidden {
return YES; // 强制返回隐藏状态
}

// 也可以 Hook setter 方法，防止外部修改
- (void)setHidden:(BOOL)hidden {
%orig(YES); // 无论传入什么值，都强制设为 YES
}

%end

%hook BDMineBannerCell ////我的页面 图片Banner

// Hook getter 方法 `isHidden`，使其始终返回 YES (1)
- (BOOL)isHidden {
return YES; // 强制返回隐藏状态
}

// 也可以 Hook setter 方法，防止外部修改
- (void)setHidden:(BOOL)hidden {
%orig(YES); // 无论传入什么值，都强制设为 YES
}

%end

%hook BDHealthServiceCollectionCell //我的页面 健康服务

// Hook getter 方法 `isHidden`，使其始终返回 YES (1)
- (BOOL)isHidden {
return YES; // 强制返回隐藏状态
}

// 也可以 Hook setter 方法，防止外部修改
- (void)setHidden:(BOOL)hidden {
%orig(YES); // 无论传入什么值，都强制设为 YES
}

%end
